package com.vtuzx.kingdee.xqc_api.service;

import com.vtuzx.core.VtuzxException;
import com.vtuzx.core.bean.dto.VtuzxMap;
import com.vtuzx.core.bean.dto.VtuzxToken;
import com.vtuzx.web.bean.VtuzxDownloadBean;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.query.Criteria;

import java.io.File;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * 采购服务
 */
public interface IXqcProduceService {

    /**
     * 绑定箱号和RFID
     *
     * @param boxNo 箱号
     * @param rfid  RFID
     */
    void bindPrdColBoxRfid(String boxNo, String rfid) throws VtuzxException;

    /**
     * 根据箱号获取车间入库的物料信息(绑定RFID专用)
     *
     * @param boxNo 箱号
     * @return 车间入库的物料信息
     */
    VtuzxMap getPrdColMaterialForBind(String boxNo) throws VtuzxException;

    /**
     * 保存用户生产领料单
     *
     * @param _userId 用户ID
     */
    VtuzxMap saveUserPrdPick(ObjectId _userId, String name, Map<String, Object> param) throws VtuzxException;

    /**
     * 添加用户生产领料箱号+数量
     *
     * @param _userId 用户ID
     * @param stockNo 仓库编码
     * @param boxNo   箱号
     * @return 添加后物料信息
     */
    VtuzxMap addUserPrdPickMaterialBox(ObjectId _userId, String name, String stockNo, String boxNo, int count) throws VtuzxException;


    /**
     * 添加用户生产领料箱号+数量
     *
     * @param _userId 用户ID
     * @param stockNo 仓库编码
     * @param boxList 箱号
     * @return 添加后物料信息
     */
    Object addUserPrdPickMaterialBoxList(ObjectId _userId, String name, String stockNo, List<Map<String, Object>> boxList) throws VtuzxException;

    /**
     * 删除用户生产领料单分录
     *
     * @param _userId 用户ID
     * @return 删除后物料信息
     */
    VtuzxMap deleteUserPrdPickMaterialBox(ObjectId _userId, String id);

    /**
     * 删除用户生产领料单分录
     *
     * @param _userId 用户ID
     * @param id      id
     */
    void deleteUserPrdPickMaterial(ObjectId _userId, String id);

    /**
     * 删除用户生产领料单分录箱的重量
     *
     * @param _userId 用户ID
     * @param stockNo 仓库编码
     */
    void deleteUserPrdPick(ObjectId _userId, String stockNo);

    /**
     * 更新用户生产领料单分录箱的重量
     *
     * @param _userId    用户ID
     * @param stockNo    仓库编码
     * @param materialNo 物料编码
     * @param boxNo      物料编码
     * @param count      数量
     * @return 更新后物料信息
     */
    VtuzxMap updateUserPrdPickMaterialBox(ObjectId _userId, String stockNo, String materialNo, String boxNo, double count);

    /**
     * 获取用户未保存生产领料单分录列表
     *
     * @param _userId 用户ID
     * @param stockNo 仓库编码
     * @return 用户未保存采购入库单分录的箱号列表
     */
    VtuzxMap getUserPrdPickMaterial(ObjectId _userId, String stockNo);

    /**
     * 获取用户未保存生产领料单分录的箱号列表
     *
     * @param _userId 用户ID
     * @return 用户未保存采购入库单分录的箱号列表
     */
    VtuzxMap getUserPrdPickMaterialBox(ObjectId _userId, String _detailId);

    /**
     * 获取创建者生产领料单列表
     *
     * @param _userId 用户ID
     * @param param   仓库编码
     * @return 采购入库单列表
     */
    VtuzxMap getPrdPickBill(ObjectId _userId, Map<String, Object> param, int pageIndex, int pageSize);

    /**
     * 获取创建者生产领料单分录
     *
     * @param _userId 用户ID
     * @param stockNo 仓库编码
     * @param billNo  采购入库单号
     * @return 采购入库单分录
     */
    VtuzxMap getPrdPickBillDetail(ObjectId _userId, String stockNo, String billNo);

    /**
     * 获取创建者生产领料单分录的箱号列表
     *
     * @param _userId 用户ID
     * @return 采购入库单分录的箱号列表
     */
    VtuzxMap getPrdPickBillDetailBox(ObjectId _userId, String _detailId);

    /**
     * 根据收货单号制作用户采购入库单
     *
     * @param _userId    用户ID
     * @param userName   用户名
     * @param stockNo    仓库编码
     * @param locationNo 仓位编码
     * @param billNoList 单号列表
     */
    void saveUserPrdInByPrdColList(ObjectId _userId, String userName, String stockNo, String locationNo, List<String> billNoList) throws Exception;

    /**
     * 保存用户采购入库单
     *
     * @param _userId  用户ID
     * @param userName 用户名
     * @param stockNo  仓库编码
     */
    void saveUserPrdIn(ObjectId _userId, String userName, String stockNo) throws Exception;

    /**
     * 添加用户采购入库箱号+数量
     *
     * @param _userId    用户ID
     * @param userName   用户名
     * @param stockNo    仓库编码
     * @param locationNo 仓位编码
     * @param boxNo      箱号
     * @param count      数量
     * @return 添加后物料信息
     */
    VtuzxMap addUserPrdInMaterialBox(ObjectId _userId, String userName, String stockNo, String locationNo, String boxNo, double count) throws VtuzxException;


    /**
     * 添加用户采购入库箱号+数量
     *
     * @param _userId    用户ID
     * @param userName   用户名
     * @param stockNo    仓库编码
     * @param locationNo 仓位编码
     * @param boxList    箱号列表
     * @return 添加后物料信息
     */
    VtuzxMap addUserPrdInMaterialBoxList(ObjectId _userId, String userName, String stockNo, String locationNo, List<Map<String, Object>> boxList) throws VtuzxException;

    /**
     * 删除用户采购入库单分录
     *
     * @param _userId 用户ID
     * @return 删除后物料信息
     */
    VtuzxMap deleteUserPrdInMaterialBox(ObjectId _userId, String id);


    /**
     * 删除用户采购入库单分录
     *
     * @param _userId 用户ID
     */
    void deleteUserPrdInMaterial(ObjectId _userId, String id);


    /**
     * 删除用户采购入库单分录箱的重量
     *
     * @param _userId 用户ID
     * @param stockNo 仓库编码
     */
    void deleteUserPrdIn(ObjectId _userId, String stockNo);

    /**
     * 更新用户采购入库单分录箱的重量
     *
     * @param _userId 用户ID
     * @param boxNo   物料编码
     * @param count   数量
     * @return 更新后物料信息
     */
    VtuzxMap updateUserPrdInMaterialBox(ObjectId _userId, String boxNo, double count);

    /**
     * 获取用户未保存采购入库单分录列表
     *
     * @param _userId 用户ID
     * @param stockNo 仓库编码
     * @return 用户未保存采购入库单分录的箱号列表
     */
    VtuzxMap getUserPrdInMaterial(ObjectId _userId, String stockNo);

    /**
     * 获取用户未保存采购入库单分录的箱号列表
     *
     * @param _userId 用户ID
     * @return 用户未保存采购入库单分录的箱号列表
     */
    VtuzxMap getUserPrdInMaterialBox(ObjectId _userId, String id);


    /**
     * 获取创建者采购入库单列表
     *
     * @param _userId 用户ID
     * @return 采购入库单列表
     */
    VtuzxMap getPrdInBill(ObjectId _userId, int pageIndex, int pageSize, Map<String, Object> param);

    /**
     * 获取创建者采购入库单分录
     *
     * @param _userId       用户ID
     * @param stockNo       仓库编码
     * @param stockInBillNo 采购入库单号
     * @return 采购入库单分录
     */
    VtuzxMap getPrdInBillDetail(ObjectId _userId, String stockNo, String stockInBillNo);

    /**
     * 获取创建者采购入库单分录的箱号列表
     *
     * @return 采购入库单分录的箱号列表
     */
    VtuzxMap getPrdInBillDetailBox(ObjectId _userId, String _detailId);

    /**
     * 上传采购收货单
     *
     * @param _userId  用户ID
     * @param userName 用户名
     * @param file     文件
     */
    void uploadPrdColBill(ObjectId _userId, String userName, File file) throws Exception;

    /**
     * 保存采购收货单
     *
     * @param _userId  用户ID
     * @param userName 用户名
     * @param param    采购收货单详细
     */
    VtuzxMap savePrdColBill(ObjectId _userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 保存采购收货单(供应商)
     *
     * @param userId
     * @param name
     * @param param
     */
    void savePrdColBillSupplier(ObjectId userId, String name, Map<String, Object> param);


    /**
     * 保存生产收货单(干参)
     *
     * @param userId
     * @param name
     * @param param
     * @return
     */
    void saveSimpleColBill(ObjectId userId, String name, Map<String, Object> param) throws VtuzxException;

    /**
     * 删除采购收货单
     *
     * @param _userId 用户ID
     * @param billNo  单号
     */
    void deletePrdColBill(ObjectId _userId, String userName, String billNo) throws VtuzxException;

    /**
     * 审核采购收货单
     *
     * @param _userId  用户ID
     * @param userName 用户名
     * @param billNo   单号
     */
    VtuzxMap auditPrdColBill(ObjectId _userId, String userName, String billNo) throws VtuzxException;

    /**
     * 反审核采购收货单
     *
     * @param _userId 用户ID
     * @param billNo  单号
     */
    VtuzxMap unauditPrdColBill(ObjectId _userId, String name, String billNo) throws VtuzxException;

    /**
     * 根据箱号获取采购收货的物料信息
     *
     * @param boxNo 箱号
     * @return 采购收货的物料信息
     */
    VtuzxMap getPrdColMaterial(String boxNo) throws VtuzxException;

    /**
     * 根据RFID获取采购收货的物料信息
     *
     * @param rfidList RFID列表
     * @return 采购收货的物料信息
     */
    VtuzxMap getPrdColMaterialByRfid(List<String> rfidList);

    /**
     * 获取采购收货单物料列表
     *
     * @param _userId   用户ID
     * @param param     检索条件
     * @param pageIndex 页号
     * @param pageSize  页大小
     * @return 采购收货单物料箱号列表
     */
    VtuzxMap getPrdColBill(ObjectId _userId, Map<String, Object> param, int pageIndex, int pageSize);

    /**
     * 获取采购收货单物料列表
     *
     * @param _userId 用户ID
     * @param billNo  单号
     * @return 采购收货单物料箱号列表
     */
    VtuzxMap getPrdColBillDetail(ObjectId _userId, String billNo) throws VtuzxException;

    /**
     * 下载采购收货单箱号清单
     *
     * @param _userId 用户ID
     * @param billNo  单号
     * @return 采购收货单箱号清单excel文件
     */
    VtuzxDownloadBean downloadPrdColBillBarcode(ObjectId _userId, String billNo) throws Exception;

    /**
     * 下载采购收货单箱号清单
     *
     * @param _userId    用户ID
     * @param billNoList 单号列表
     * @return 采购收货单箱号清单excel文件
     */
    VtuzxDownloadBean downloadPrdColBillBarcodeList(ObjectId _userId, List<String> billNoList) throws Exception;

    /**
     * 生产任务单生成用料清单
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap taskBillToMaterialList(ObjectId userId, String userName, Map<String, Object> param);

    /**
     * 创建生产任务单和物料清单
     *
     * @param userId
     * @param userName
     * @param param
     */
    void createPrdTaskBill(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 审核生产任务单
     *
     * @param userId
     * @param userName
     * @param param
     */
    void auditPrdTaskBill(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 获取生产任务列表（pda）
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap getPrdTaskListPda(ObjectId userId, String userName, List<String> characterKeyList, Map<String, Object> param);

    /**
     * 获取生产任务列表（web）
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap getPrdTaskListWeb(ObjectId userId, String userName, Map<String, Object> param);

    /**
     * 获取生产任务列表（webBN）
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap getPrdTaskListWebBn(ObjectId userId, String userName, Map<String, Object> param);

    /**
     * 获取生产任务详细（pda/web）
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap getPrdTaskDetail(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 获取生产任务详细（pda/web）BN
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap getPrdTaskDetailBn(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 获取用料清单列表（pda）
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap getMaterialBomListPda(ObjectId userId, String userName, Map<String, Object> param);

    /**
     * 获取用料清单列表（web）
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap getMaterialBomListWeb(ObjectId userId, String userName, Map<String, Object> param);

    /**
     * 获取用料清单详细（pda/web）
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap getMaterialBomDetail(ObjectId userId, String userName, Map<String, Object> param);

    /**
     * 用料清单领料扫描箱子
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap getMaterialBomBox(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 用料清单领料扫描rfid
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap getMaterialBomRfid(ObjectId userId, String userName, Map<String, Object> param);

    /**
     * 用料清单领料添加箱子
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap addMaterialBomBox(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 创建（生产领料单）领料订单
     *
     * @param userId
     * @param userName
     * @param param
     */
    VtuzxMap createMaterialBomPickBill(ObjectId userId, String userName, Map<String, Object> param) throws Exception;


    /**
     * 审核（生产领料单）领料订单
     *
     * @param userId
     * @param userName
     * @param param
     */
    void auditMaterialBomPickBill(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 获取用户临时（生产领料单）生产领料物料列表
     *
     * @param userId
     * @param stockNo
     * @return
     */
    VtuzxMap getUserMaterialBomPickMaterial(ObjectId userId, String stockNo, String billNo, String taskBillNo);

    /**
     * 获取用户临时(生产领料单)生产领料物料箱号列表
     *
     * @param userId
     * @param detailId
     * @return
     */
    VtuzxMap getUserMaterialBomPickMaterialBox(ObjectId userId, String detailId);

    /**
     * 删除用户临时(生产领料单)生产领料物料
     *
     * @param userId
     * @param id
     */
    void deleteUserMaterialBomPickMaterial(ObjectId userId, String id);

    /**
     * 删除用户临时(生产领料单)生产领料物料箱号
     *
     * @param userId
     * @param id
     */
    void deleteUserMaterialBomPickMaterialBox(ObjectId userId, String id);

    /**
     * 获取（生产用料单）生产领料单
     *
     * @param userId
     * @param param
     * @param pageIndex
     * @param pageSize
     * @return
     */
    default VtuzxMap getMaterialBomPickBill(ObjectId userId, Map<String, Object> param, int pageIndex, int pageSize) {
        return null;
    }

    /**
     * 获取（生产用料单）生产领料单BN
     *
     * @param userId
     * @param param
     * @param pageIndex
     * @param pageSize
     * @return
     */
    VtuzxMap getMaterialBomPickBillBn(ObjectId userId, Map<String, Object> param, int pageIndex, int pageSize);

    /**
     * 获取（生产用料单）生产领料单分录列表
     *
     * @param userId
     * @param billNo
     * @return
     */
    VtuzxMap getMaterialBomPickBillDetail(ObjectId userId, String billNo);

    /**
     * 获取（生产用料单）生产领料单分录列表BN
     *
     * @param userId
     * @param billNo
     * @return
     */
    VtuzxMap getMaterialBomPickBillDetailBn(ObjectId userId, String billNo);

    /**
     * 获取（生产用料单）生产领料单分录的箱号详细
     *
     * @param userId
     * @param detailId
     * @return
     */
    VtuzxMap getMaterialBomPickBillDetailBox(ObjectId userId, String detailId);

    /**
     * 用料清单补料添加箱子
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap addMaterialBomSupplementBox(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 创建（生产领料单）补料订单
     *
     * @param userId
     * @param userName
     * @param param
     */
    VtuzxMap createMaterialBomSupplementBill(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 审核（生产领料单）补料订单
     *
     * @param userId
     * @param userName
     * @param param
     */
    void auditMaterialBomSupplementBill(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 获取用户临时（生产领料单）生产补料物料列表
     *
     * @param userId
     * @param stockNo
     * @return
     */
    VtuzxMap getUserMaterialBomSupplementMaterial(ObjectId userId, String stockNo, String billNo);

    /**
     * 获取用户临时(生产领料单)生产补料物料箱号列表
     *
     * @param userId
     * @param detailId
     * @return
     */
    VtuzxMap getUserMaterialBomSupplementMaterialBox(ObjectId userId, String detailId);

    /**
     * 删除用户临时(生产领料单)生产补料物料
     *
     * @param userId
     * @param id
     */
    void deleteUserMaterialBomSupplementMaterial(ObjectId userId, String id);

    /**
     * 删除用户临时(生产领料单)生产补料物料箱号
     *
     * @param userId
     * @param id
     */
    void deleteUserMaterialBomSupplementMaterialBox(ObjectId userId, String id);

    /**
     * 获取（生产用料单）生产补料单
     *
     * @param userId
     * @param param
     * @param pageIndex
     * @param pageSize
     * @return
     */
    VtuzxMap getMaterialBomSupplementBill(ObjectId userId, Map<String, Object> param, int pageIndex, int pageSize);

    /**
     * 获取（生产用料单）生产补料单BN
     *
     * @param userId
     * @param param
     * @param pageIndex
     * @param pageSize
     * @return
     */
    VtuzxMap getMaterialBomSupplementBillBn(ObjectId userId, Map<String, Object> param, int pageIndex, int pageSize);

    /**
     * 获取（生产用料单）生产补料单分录列表
     *
     * @param userId
     * @param billNo
     * @return
     */
    VtuzxMap getMaterialBomSupplementBillDetail(ObjectId userId, String billNo);

    /**
     * 获取（生产用料单）生产补料单分录列表BN
     *
     * @param userId
     * @param billNo
     * @return
     */
    VtuzxMap getMaterialBomSupplementBillDetailBn(ObjectId userId, String billNo);

    /**
     * 获取（生产用料单）生产补料单分录的箱号详细
     *
     * @param userId
     * @param detailId
     * @return
     */
    VtuzxMap getMaterialBomSupplementBillDetailBox(ObjectId userId, String detailId);

    /**
     * 生产退料取生产领料补料列表
     *
     * @param userId
     * @param taskBillNo
     * @return
     */
    VtuzxMap getProduceReturnList(ObjectId userId, String taskBillNo);

    /**
     * 生产退料取生产领料补料（箱号）
     *
     * @param userId
     * @param taskBillNo
     * @param boxNo
     * @return
     */
    VtuzxMap getProduceReturnBox(ObjectId userId, String taskBillNo, String boxNo) throws VtuzxException;

    /**
     * 生产退料取生产领料补料（rfid）
     *
     * @param userId
     * @param taskBillNo
     * @param rfidList
     * @return
     */
    VtuzxMap getProduceReturnRfid(ObjectId userId, String taskBillNo, List<String> rfidList) throws VtuzxException;

    /**
     * 用料清单退料添加箱子
     *
     * @param userId
     * @param userName
     * @param dataList
     * @param taskBillNo
     * @param materialBomBillNo
     */
    void addMaterialBomBoxReturn(ObjectId userId, String userName, List<Map<String, Object>> dataList, String taskBillNo, String materialBomBillNo) throws VtuzxException;

    /**
     * 创建（生产领料单）退料订单
     *
     * @param userId
     * @param userName
     * @param param
     */
    void createMaterialBomReturnBill(ObjectId userId, String userName, Map<String, Object> param) throws InterruptedException;

    /**
     * 获取生产退料列表（pda）
     *
     * @param userId
     * @param userName
     * @param billNo
     * @return
     */
    VtuzxMap getPrdReturnListPda(ObjectId userId, String userName, String billNo);

    /**
     * 获取用户临时（生产领料单）生产退料物料列表
     *
     * @param userId
     * @return
     */
    VtuzxMap getUserMaterialBomReturnMaterial(ObjectId userId);

    /**
     * 获取用户临时(生产领料单)生产退料物料箱号列表
     *
     * @param userId
     * @param detailId
     * @return
     */
    VtuzxMap getUserMaterialBomReturnMaterialBox(ObjectId userId, String detailId);

    /**
     * 删除用户临时(生产领料单)生产退料物料
     *
     * @param userId
     * @param id
     */
    void deleteUserMaterialBomReturnMaterial(ObjectId userId, String id);

    /**
     * 删除用户临时(生产领料单)生产退料物料箱号
     *
     * @param userId
     * @param id
     */
    void deleteUserMaterialBomReturnMaterialBox(ObjectId userId, String id);

    /**
     * 获取（生产用料单）生产退料单
     *
     * @param userId
     * @param param
     * @param pageIndex
     * @param pageSize
     * @return
     */
    VtuzxMap getMaterialBomReturnBill(ObjectId userId, Map<String, Object> param, int pageIndex, int pageSize);

    /**
     * 获取（生产用料单）生产退料单BN
     *
     * @param userId
     * @param param
     * @param pageIndex
     * @param pageSize
     * @return
     */
    VtuzxMap getMaterialBomReturnBillBn(ObjectId userId, Map<String, Object> param, int pageIndex, int pageSize);

    /**
     * 获取（生产用料单）生产退料单分录列表
     *
     * @param userId
     * @param billNo
     * @return
     */
    VtuzxMap getMaterialBomReturnBillDetail(ObjectId userId, String billNo);

    /**
     * 获取（生产用料单）生产退料单分录列表
     *
     * @param userId
     * @param billNo
     * @return
     */
    VtuzxMap getMaterialBomReturnBillDetailBn(ObjectId userId, String billNo);

    /**
     * 获取（生产用料单）生产退料单分录的箱号详细
     *
     * @param userId
     * @param detailId
     * @return
     */
    VtuzxMap getMaterialBomReturnBillDetailBox(ObjectId userId, String detailId);

    /**
     * 完成生产任务单生成车间收货
     *
     * @param userId
     * @param userName
     * @param billNo
     */
    void savePrdTaskToPrdCol(ObjectId userId, String userName, String billNo, String supplierBatchNo, String produceDate) throws Exception;

    /**
     * 生产扫码入库的扫码(boxNo)
     *
     * @param userId
     * @param userName
     * @param boxNo
     * @return
     */
    VtuzxMap prdInScanBoxNo(ObjectId userId, String userName, String boxNo, String billNo) throws VtuzxException;

    /**
     * 生产扫码入库的扫码(rfid)
     *
     * @param userId
     * @param userName
     * @param billNo
     * @param rfidList
     * @return
     */
    VtuzxMap prdInScanRfid(ObjectId userId, String userName, String billNo, List<String> rfidList);

    /**
     * 生产扫码入库加箱子
     *
     * @param userId
     * @param userName
     * @param boxList
     * @return
     */
    VtuzxMap addPrdInBoxList(ObjectId userId, String userName, List<Map<String, Object>> boxList, String stockNo, String locationNo, String billNo) throws VtuzxException;

    /**
     * 生产扫码入库创建订单
     *
     * @param userId
     * @param userName
     * @return
     */
    void createPrdInBill(ObjectId userId, String userName, String taskBillNo, String stockNo) throws VtuzxException;

    /**
     * 获取用户临时（生产领料单）生产入库物料列表
     *
     * @param userId
     * @param stockNo
     * @return
     */
    VtuzxMap getUserMaterialBomInMaterial(ObjectId userId, String stockNo);

    /**
     * 获取用户临时(生产领料单)生产入库物料箱号列表
     *
     * @param userId
     * @param detailId
     * @return
     */
    VtuzxMap getUserMaterialBomInMaterialBox(ObjectId userId, String detailId);

    /**
     * 删除用户临时(生产领料单)生产入库物料
     *
     * @param userId
     * @param id
     */
    void deleteUserMaterialBomInMaterial(ObjectId userId, String id);

    /**
     * 删除用户临时(生产领料单)生产入库物料箱号
     *
     * @param userId
     * @param id
     */
    void deleteUserMaterialBomInMaterialBox(ObjectId userId, String id);

    /**
     * 获取生产任务的生产入库单
     *
     * @param userId
     * @param pageIndex
     * @param pageSize
     * @param param
     * @return
     */
    VtuzxMap getPrdInList(ObjectId userId, int pageIndex, int pageSize, Map<String, Object> param);

    /**
     * 获取生产任务的生产入库单分录列表
     *
     * @param userId
     * @return
     */
    VtuzxMap getPrdInDetail(ObjectId userId, String billNo);

    /**
     * 获取生产任务的生产入库单分录的箱号详细
     *
     * @param userId
     * @param detailId
     * @return
     */
    VtuzxMap getPrdInDetailBox(ObjectId userId, String detailId);

    VtuzxMap getPrdTaskListPick(ObjectId userId, String userName, Map<String, Object> param);

    VtuzxMap getPrdTaskListSupplementReturn(ObjectId userId, String userName, Map<String, Object> param);

    VtuzxMap getSortingSaveTaskMaterial(ObjectId userId, String userName, Map<String, Object> param);

    void materialBomPickConfirm(ObjectId userId, String userName, Map<String, Object> param);

    VtuzxMap getBomSortingList(ObjectId userId, String userName, Map<String, Object> param);

    void deletePrdTaskBill(ObjectId userId, String billNo) throws VtuzxException;

    VtuzxMap getPrdTaskBillNo(ObjectId userId, String name, String key, int pageIndex, int pageSize);

    void closePrdOrder(ObjectId userId, List<String> billNoList) throws VtuzxException;

//    /**
//     * 反盐入库添加箱子
//     * @param userId
//     * @param userName
//     * @param param
//     * @return
//     */
//    VtuzxMap addDesaltingInStockBox(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 创建反盐入库
     *
     * @param userId
     * @param userName
     * @param param
     */
    void createDesaltingInStockBill(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

//    /**
//     * 获取用户临时反盐入库物料列表
//     * @param userId
//     * @param stockNo
//     * @return
//     */
//    VtuzxMap getUserDesaltingInStockMaterial(ObjectId userId, String stockNo);
//
//    /**
//     * 获取用户临时反盐入库物料箱号列表
//     * @param userId
//     * @param detailId
//     * @return
//     */
//    VtuzxMap getUserDesaltingInStockMaterialBox(ObjectId userId, String detailId);
//
//    /**
//     * 删除用户临时反盐入库物料
//     * @param userId
//     * @param id
//     */
//    void deleteUserDesaltingInStockMaterial(ObjectId userId, String id);
//
//    /**
//     * 删除用户临时反盐入库物料箱号
//     * @param userId
//     * @param id
//     */
//    void deleteUserDesaltingInStockMaterialBox(ObjectId userId, String id);

    /**
     * 获取反盐入库单
     *
     * @param userId
     * @param param
     * @param pageIndex
     * @param pageSize
     * @return
     */
    VtuzxMap getDesaltingInStockBill(ObjectId userId, Map<String, Object> param, int pageIndex, int pageSize);

    /**
     * 获取反盐入库单分录列表
     *
     * @param userId
     * @param billNo
     * @return
     */
    VtuzxMap getDesaltingInStockBillDetail(ObjectId userId, String billNo);

    /**
     * 获取反盐入库单分录的箱号详细
     *
     * @param userId
     * @param detailId
     * @return
     */
    VtuzxMap getDesaltingInStockBillDetailBox(ObjectId userId, String detailId);

    VtuzxMap getPrdTaskBillNumberReturn(ObjectId userId, String billNo);

    VtuzxMap inventoryTest(ObjectId userId, String stockNo);

    void prdTaskEnd(ObjectId userId, String name, String billNo) throws VtuzxException;

    /**
     * 获取生产任务的退料入库单
     *
     * @param userId
     * @param pageIndex
     * @param pageSize
     * @param param
     * @return
     */
    VtuzxMap getReturnInList(ObjectId userId, int pageIndex, int pageSize, Map<String, Object> param);

    /**
     * 获取生产任务的退料入库单分录列表
     *
     * @param userId
     * @param billNo
     * @return
     */
    VtuzxMap getReturnInDetail(ObjectId userId, String billNo);

    /**
     * 获取生产任务的生产退料单分录的箱号详细
     *
     * @param userId
     * @param detailId
     * @return
     */
    VtuzxMap getReturnInDetailBox(ObjectId userId, String detailId);

    void saveTaskAddPrdCol(ObjectId userId, String name, Map<String, Object> param) throws VtuzxException, InterruptedException;

    void saveTaskDeletePrdCol(ObjectId userId, String name, Map<String, Object> param) throws VtuzxException;

    VtuzxMap saveTaskGetPrdColList(ObjectId userId, String name, Map<String, Object> param) throws VtuzxException;

    void saveTaskAddPrdColTraceBack(ObjectId userId, String name, Map<String, Object> param);

    void saveTaskNoPrint(ObjectId userId, String name, Map<String, Object> param);

    VtuzxMap getPrdColBatch(ObjectId userId, String name, Map<String, Object> param);

    VtuzxMap getMaterialPickBillTask(ObjectId userId, String name, Map<String, Object> param);

    VtuzxMap getMaterialByBox(ObjectId userId, String name, Map<String, Object> param) throws VtuzxException;

    void createSimplePrdIn(ObjectId userId, String name, Map<String, Object> param) throws VtuzxException;

    VtuzxMap getPrdTaskImplList(ObjectId userId, String userName, Map<String, Object> param);

    VtuzxDownloadBean downloadPrdTaskImplList(VtuzxToken token, Map<String, Object> param) throws Exception;

    VtuzxMap getPrdTaskAuditList(ObjectId userId, String userName, Map<String, Object> param);

    VtuzxDownloadBean downloadPrdTaskAuditList(VtuzxToken token, Map<String, Object> param) throws Exception;

    List<VtuzxMap> changeList(Iterator<Document> innerItr);

    VtuzxMap getProduceTaskAuditDetail(ObjectId userId, String billNo);

    List<VtuzxMap> getAuditList(Iterator<Document> innerItr, String taskBillNo, Criteria cond);

    /**
     * 修改生产任务备注
     *
     * @param _userId  用户ID
     * @param userName 用户名
     * @param param    采购收货单详细
     */
    VtuzxMap saveProTaskBill(ObjectId _userId, String userName, Map<String, Object> param) throws VtuzxException;

    VtuzxMap getPrdColPartBill(ObjectId userId, Map<String, Object> param, int pageIndex, int pageSize);

    VtuzxDownloadBean downloadPrdColPartBill(VtuzxToken token, Map<String, Object> param) throws Exception;

    VtuzxMap updatePrdColSeal(ObjectId userId, String name, Map<String, Object> param);

    VtuzxMap updateMaterialSeal(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 创建特殊（生产领料单）领料订单
     *
     * @param userId
     * @param param
     * @paramuserName
     */
//    VtuzxMap createMaterialBomPickBillSpecial(ObjectId userId, String userName, Map<String, Object> param) throws Exception;

    VtuzxMap updateSupplementSeal(ObjectId userId, String name, Map<String, Object> param);

    VtuzxMap updatePrdTaskSeal(ObjectId userId, String name, Map<String, Object> param);

    VtuzxMap addPrdColAndGetPrdCol(ObjectId userId, String name, Map<String, Object> param) throws VtuzxException, InterruptedException;

    //手动传金蝶退料单
    VtuzxMap syncKingdeeReturn(ObjectId userId, String name, List<String> billNoList) throws Exception;

    //手动传金蝶变品退料
    VtuzxMap syncKingdeeDesalting(ObjectId userId, String userName, List<Map<String, Object>> billNoList) throws Exception;

    //手动传金蝶入库
    VtuzxMap syncKingdeeInStock(ObjectId userId, String userName, List<String> billNoList) throws Exception;

    //手动传金蝶任务
    VtuzxMap uploadKingdeeTask(ObjectId userId, String userName, Map<String, Object> param) throws Exception;

    //手动传金蝶任务BN
    VtuzxMap uploadKingdeeTaskBn(ObjectId userId, String userName, Map<String, Object> param) throws Exception;

    //生产任务状态关闭改审核
    VtuzxMap updatePrdType(ObjectId userId, String name, List<String> billNoList) throws VtuzxException;

    VtuzxMap updatePrdBusinessStatus(ObjectId userId, String name, List<String> billNoList) throws VtuzxException;

    VtuzxMap changeMaterialBomActual(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 修改补料单实际补料重量
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap changeSupplimentBomActual(ObjectId userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 导出生产任务
     *
     * @param token
     * @param param
     * @return
     */
    VtuzxDownloadBean downloadPrdTaskList(VtuzxToken token, Map<String, Object> param) throws Exception;

    /**
     * 导出生产任务Bn
     *
     * @param token
     * @param param
     * @return
     */
    VtuzxDownloadBean downloadPrdTaskListBn(VtuzxToken token, Map<String, Object> param) throws Exception;

    VtuzxDownloadBean downloadBean(List<Document> dataList, String type) throws Exception;

    VtuzxDownloadBean downloadMaterialPickList(VtuzxToken token, Map<String, Object> param) throws Exception;

    VtuzxDownloadBean downloadMaterialSupplimentList(VtuzxToken token, Map<String, Object> param) throws Exception;

    VtuzxDownloadBean downloadPrdInList(VtuzxToken token, Map<String, Object> param) throws Exception;

    VtuzxDownloadBean downloadPrdInDesaltingList(VtuzxToken token, Map<String, Object> param) throws Exception;

    VtuzxDownloadBean downloadPrdInReturnList(VtuzxToken token, Map<String, Object> param) throws Exception;

    /**
     * 批量审核生产订单
     *
     * @param userId
     * @param userName
     * @param param
     */
    void auditPrdTaskBillList(ObjectId userId, String userName, Map<String, Object> param);

    /**
     * 校验任务向下的车间收货是否全都入库
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap checkPrdColIstock(ObjectId userId, String userName, Map<String, Object> param);

    /**
     * 校验有没有同品通批次入到不同仓库的
     *
     * @param userId
     * @param userName
     * @param param
     * @return
     */
    VtuzxMap checkPrdTask(ObjectId userId, String userName, Map<String, Object> param);

    VtuzxMap checkPrdColBatch(ObjectId userId, String name, Map<String, Object> param);
}